package source.Objetos {
    import net.flashpunk.Entity;
    import net.flashpunk.graphics.Image;
    import net.flashpunk.graphics.Text;
    import net.flashpunk.FP;
    import source.Assets;
    import source.Global;

	public class Cartel extends Entity {
		public var contenedorTexto:Entity;	 //entidad que contendrá el texto del cartel
		public var contenedorVentana:Entity; //entidad que contendrá la imagen de la ventana emergente para mostrar el diálogo
		
        /**
         * Cartel
         * Constructor
         */
		public function Cartel(x:int, y:int, _texto:String) {
			super(x, y);
			
            //gráfico y hitbox:
			graphic = new Image(Assets.OBJ_CARTEL);
			setHitbox(7, 23, -9, -2);
						
			//configuramos el texto:
			var texto:Text = new Text(distribuirTexto(_texto)); //distribuimos el texto en líneas y lo introducimos en un objeto Text
			texto.size = 11;
			texto.font = "ModernAntiqua";
            
            //configuramos la coordenada 'x' del texto:
			var _coordX:int = x - texto.textWidth/2;
			if (_coordX < 15) _coordX = 15;
            
            //configuramos la coordenada 'y' del texto:
			var _coordY:int = y - Global.grid - texto.textHeight;
			if (_coordY < 15) _coordY = 15;
            
            //posicionamos el texto:
			contenedorTexto = new Entity(_coordX, _coordY, texto);
            
            //creamos y posicionamos la ventana:
			contenedorVentana = new Entity(_coordX - 10, _coordY - 10, Image.createRect(texto.textWidth + 20, texto.textHeight + 6, 0, 0.75));
            
            //Si la ventana se sale por el borde derecho, la reposicionamos:
            if ((_coordX - 10 + texto.textWidth + 20) > (FP.width - 15)) {
                contenedorVentana.x = FP.width - 15 - (texto.textWidth + 20);
                contenedorTexto.x = contenedorVentana.x + 10;
            }
            
            //Si la ventana se sale por el borde inferior, la reposicionamos:
            if ((_coordY - 10 + texto.textHeight + 6) > (FP.height - 15)) {
                contenedorVentana.y = FP.height - 15 - (texto.textHeight + 6);
                contenedorTexto.y = contenedorVentana.y + 10;
            }
		}
		
        /**
         * update
         * Es llamado cada frame
         */
		override public function update():void {			
			//Si colisionamos con el pj...
			if (collideWith(Global.pj, x, y)) { //Nota: collideWith()es más rápido que collide()
				world.add(contenedorVentana);
				world.add(contenedorTexto);
			}
			else {
				world.remove(contenedorVentana);
				world.remove(contenedorTexto);
			}
		}
		
        /**
         * removed
         * Es llamado al ser eliminado del mundo
         */
		override public function removed():void {			
			world.remove(contenedorVentana);
			world.remove(contenedorTexto);
		}
		
        /**
         * distribuirTexto
         * Distribuye el texto en líneas de 'num' caracteres con wordwrap
         */
		public function distribuirTexto(_texto:String):String {
			var _aux1:String, _aux2:String;
			const num:int = 32;
			
			_aux2 = _texto;
			_aux1 = _aux2;
			_texto = "";
			
			while (_aux2.length > num) {				
				for (var i:int = _aux2.length; i >= 0; i--) { //recorremos la cadena al revés: desde el final hasta el principio
					//separamos en dos trozos sólo si el primero mide 'num' o menos y siempre y cuando cortemos por un espacio:
					if ((_aux2.charAt(i) == ' ') && (i <= num)) {
						_aux1 = _aux2.slice(0, i);
						_aux2 = _aux2.slice(i+1, _aux2.length);
						break; //hecha la separación, salimos del bucle
					}
				}
				
				_texto = _texto.concat(_aux1 + "\n"); //Concateno la primera cadena y un retorno de carro en el texto
			}
			
			//concateno lo que sobra y retorno todo:
			return _texto.concat(_aux2 + "\n "); //introduzco el "\n " porque si no no funciona y no sé porqué... he aquí una ñapa wena wena
		}
	}
}